#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <cstring>
#include <vector>
#include<queue>
using namespace std;
struct jd
{
	int x, y;
}a[100005],b[100005];
bool pan(jd a, jd b)
{
	if (a.x == b.x)
	{
		return a.y< b.y;
	}
	else
	{
		return a.x < b.x;
	}
}
int main()
{
	long long n,x,y,k=0,sum=1;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> x >> y;
		a[i].x = x;
		a[i].y = y;
	}
	sort(a, a + n, pan);
	b[0] = a[0];
	for (int i = 1; i < n; i++)
	{
		if (b[k].x !=a[i].x|| b[k].y != a[i].y)
		{
			b[++k] = a[i];
		}
	}
	//long long l=0, r=0;,如果不超时，暴力简单，还是可以尝试。
	for (int i = 0; i <= k; i++)//枚举区间右端点 
	{
		long long temp = 0;
		//注意此处一定要写在第一个循环和第二个循环之间 
		for (int j = i; j >= 0; j--)//枚举区间左端点 
		{
			if (b[i].x == b[j].x && b[i].y - b[j].y + 1 <= n)
				//如果是同色牌并且张数差小于等于n则一定能够通过换牌实现同花顺 
			{
				temp++;
			}
			else break;//不符合条件则退出 
		}
		if (temp > sum) sum = temp;//取所有可行方案中最大值 
	}
	cout << n - sum << endl;
	return 0;
}